/**
 * Copyright (c), 上海沃恩信息科技有限公司.
 * All rights reserved.
 * Licensed under BSD (https://www.pittypat.work/bsd.html).
 */

package pittypat;

import pittypat.configuration.PittypatConfig;

/**
 * 提供对 ISystemTokenProvider 的默认实现，以及提供对配置的 ISystemTokenProvider 的访问。
 * <p>
 * 如果配置文件中没有配置 systemTokenProvider，则使用该默认实现，该实现总是认为不需要系统令牌，并返回空字符串。
 */
public final class SystemTokenProvider implements ISystemTokenProvider {
	/*
	 * SystemTokenProvider 的默认对象实例。
	 */
	private static final SystemTokenProvider DEFAULT_INSTANCE = new SystemTokenProvider();

	// 当前提供程序
	private static ISystemTokenProvider currentProvider = null;
	// 同步对提供程序的访问
	private static final Object CURRENT_PROVIDER_LOCK = new Object();

	/**
	 * 获取当前配置文件中定义的系统令牌提供程序。
	 * 
	 * @return 一个 ISystemTokenProvider 对象。
	 * @throws ClassNotFoundException
	 * @throws IllegalAccessException
	 * @throws InstantiationException
	 */
	public static ISystemTokenProvider getCurrent()
			throws ClassNotFoundException, InstantiationException, IllegalAccessException {
		if (currentProvider == null) {
			synchronized (CURRENT_PROVIDER_LOCK) {
				if (currentProvider == null) {
					String typeName = PittypatConfig.getCurrent().getSystemTokenProvider();

					if (typeName == null || typeName.length() == 0) {
						currentProvider = DEFAULT_INSTANCE;
					} else {
						Class<?> type = Class.forName(typeName);
						if (type == null) {
							throw new ClassNotFoundException("没有找到作为系统令牌提供程序的类型定义：" + typeName + "。");
						}

						currentProvider = (ISystemTokenProvider) type.newInstance();
					}
				}
			}
		}

		return currentProvider;
	}

	/**
	 * 初始化 SystemTokenProvider 的新实例。
	 */
	private SystemTokenProvider() {
	}

	/**
	 * 获取当前系统的系统令牌。总是返回空字符串。
	 * 
	 * @return 当前系统的系统令牌。
	 */
	@Override
	public String getSystemToken() {
		return "";
	}
}
